<?php
/**
 * Класс, реализующий загрузку виджетов
 *
 * @category Phorm
 * @package Widget
 * @name /Phorm/Widget/Loader.php
 * @copyright phorm.ru
 * @since 09.05.2012
 * @author vladimir@kachalov.net
 */

class Phorm_Widget_Loader extends Phorm_Widget {
	
	/**
	 * Объект кеша
	 * @var Zend_Cache_Core
	 */
	private $_cache;
	
	/**
	 * Возвращает список отрендеренных слоев
	 *  
	 * @return array
	 */
		
	public function getLayouts() {
		
		$this->_cache = $this->getCache('widgets');
		
		$layout = $this->_boot->getResource('Layout');
		
		$Layouts = array();
		
		if($WidgetsList = $this->_getWidgetsList()) {
			
			if(is_array($WidgetsList['widgets'])) {
		
				foreach ($WidgetsList['widgets'] as $layoutname=>$data) {
					
					foreach ($data as $row) {
						
						/**
						 * Определяем параметры, передаваемые непосредственно в класс виджета
						 */
						$params = $row;
						unset($params['typeid'],$params['widgetname'],$params['showincats'],$params['acl'],$params['typeinfo']);
						
						/**
						 * Инициализируем класс виджета
						 */
						$Widget = new $row['typeinfo']['classname']();
						$Widget -> setOptions($params)
								-> setSettings($row['typeinfo']['template'],$row['typeinfo']['context']);
						
						/**
						 * Определяем идентификатор кеша
						 */
						//$cacheid  = 'widget_' . $row['widgetid'] . '_' . $this->_getCacheIdentity();
						$cacheid = uniqid();
						
						/**
						 * Проверяем необходимость кеширования и наличие записи в кеше
						 */
						if(isset($Widget->_settings['cache']) && !empty($Widget->_settings['cache']) && $this->_cache->test($cacheid)) {
							
							$Layouts[$layoutname][] = $this->_cache->load($cacheid);
							
						/**
						 * Если записи в кеше нет, то получаем данные из класса виджета
						 */
						} else {
							
							$layout->setLayout($this->_params['module'] . '/widgets/' . $row['typeinfo']['template']);
							
							$layout->getView()->context = $row['typeinfo']['context'];
							$layout->getView()->options = $params;
							$layout->getView()->content = $Widget->getData();
							
							$out = $layout->render();
							$Layouts[$layoutname][] = $out;
							
							// Сохраняем запись в кеше
							/*if(isset($Widget->_settings['cache']) && !empty($Widget->_settings['cache'])) {
								$cachetags = is_string($Widget->_settings['cache']['tag']) ?  array($Widget->_settings['cache']['tag']) : $Widget->_settings['cache']['tag'];
								$this->_cache->save($out,$cacheid,$cachetags);
							}*/
						
						}
		
					}
					
				}
				
				return $Layouts;
			
			}
		
		}
		
		return false;
		
	}
	
	
	/**
	 * Возвращает список виджетов для текущего набора и текущего пользователя
	 *  
	 * @return array
	 */
		
	private function _getWidgetsList() {
		
		/**
		 * Определяем идентификатор кеша
		 */
		$cacheid = 'widgetslist_' . $this->_params['WidgetSetId'] . '_' . $this->_getCacheIdentity();
		
		/**
		 * Проверяем наличие записи в кеше
		 */
		
		if($this->_cache->test($cacheid)) {
			
			return $this->_cache->load($cacheid);
		
		/**
		 * Если записи в кеше нет, то делаем выборку списка виджетов
		 */
		
		} else {
			
			/**
			 * Получаем информацию о наборе виджетов
			 */
					
			if($SetInfo = $this->getWidgetsSetInfo($this->_params['WidgetSetId'])) {
				
				/**
				 * Распаковываем виджеты набора
				 * @todo Подумать над снижением кол-ва запросов к базе
				 */
				
				$SetInfo['widgets'] = Zend_Json::decode($SetInfo['widgets']);
				foreach ($SetInfo['widgets'] as $layoutcode=>$widget) {
					foreach ($widget as $key=>$params) {
						
						$SetInfo['widgets'][$layoutcode][$key] = $params = Zend_Json::decode($params);
						
						/**
						 * Проверяем права доступа к виджету
						 */
						
						if(isset($params['acl']) 
							&& is_array($params['acl']) 
								&& in_array($this->_usersession->UserData['roleid'],$params['acl'])) {
									
							/**
							 * Добавляем фильтр по разделам сайта
							 */
							
							if(isset($this->_params['categoryinfo']) 
								&& isset($params['showincats']) 
									&& is_array($params['showincats'])) {
										
								if(in_array($this->_params['categoryinfo']['categoryid'],$params['showincats'])) {
										
									/**
									 * Получаем информацию о типе виджета
									 */
									
									if($TypeInfo = $this->getWidgetTypeInfo($params['typeid'])) {
										$SetInfo['widgets'][$layoutcode][$key]['typeinfo'] = $TypeInfo;
									}
										
								}
								
							} else {
								
								/**
								 * Получаем информацию о типе виджета
								 */
									
								if($TypeInfo = $this->getWidgetTypeInfo($params['typeid'])) {
									$SetInfo['widgets'][$layoutcode][$key]['typeinfo'] = $TypeInfo;	
								}
								
							}
							
						}
						
					}
				}
				
				// Сохраняем запись в кеше
				$this->_cache->save($SetInfo,$cacheid);
				
				return $SetInfo;
				
			}
		
		}
			
		return false;
			
	}
	
	
	/**
	 * Генерит идентификатор кеша на основе текущих параметров запроса (роль,раздел,материал)
	 *  
	 * @return string
	 */
		
	private function _getCacheIdentity() {
		
		$cacheid = $this->_usersession->UserData['roleid'];
		if(isset($this->_params['categoryinfo'])) $cacheid .= '_' . $this->_params['categoryinfo']['categoryid'];
		if(isset($this->_params['resourceinfo'])) $cacheid .= '_' . $this->_params['resourceinfo']['resourceid'];
		
		return $cacheid;
		
	}
	
}
